public class Main {
    public static void main(String[] args) {

        // (网络 (重要!!!!))
        // **** 初识网络 ****
        // 网络能够跨主机通信
        // 刚开始 是局域网 :  把一些设备, 通过交换机和路由器连接到一起
        // 局域网就要求这些设备不能离得太远 (比如同一个网吧, 同一所学校, 同一个公司....)
        // 最后做到了 范围更大的局域网 广域网
        // 就是更多的局域网也能连接到一起
        // 把一个城市里的电脑都链接起来 ,  再把城市和城市之间的网络也链接起来, 越连越多,越连越大, 此时就成了 广域网

        // 单机 => 局域网 => 广域网

        // 局域网LAN
        //局域网，即 Local Area Network，简称LAN。
        //Local 即标识了局域网是本地，局部组建的一种私有网络。
        //局域网内的主机之间能方便的进行网络通信，又称为内网；局域网和局域网之间在没有连接的情况下，是无法通信的。
        //局域网组建网络的方式有很多种：
        // （1）基于网线直连  （2）基于集线器组建  （3）基于交换机组建  （4）基于交换机和路由器组建

        // 下面这三个, 都是组件网络中的几个重要设备
        // 集线器 : 功能是 把一根网线给叉出来两根 (而同一时刻只有一条道能跑)(这是一个比较古老的东西,现在很少见)
        // 交换机 : 组建局域网的
        // 路由器 : 本质上就是把 两个局域网 给连接起来的 (WiFi 本质上就是一个无线路由器)  (局域网是怎么来的呢? 可以由路由器自己连接, 也可以用交换机对多个设备进行彼此相连)
        // (路由器是可以跨局域网进行交互的, 而 交换机只能在局域网内部进行交互)
        // 当然, 在现在带有路由功能(三层转发)交换机也是很多很常见的...
        // 交换机和路由器之间的界限, 越来越模糊

        // 网络通信信号传递
        // 1. 电信号(网线), 低电平表示 1,  高电平表示 0
        // 2. 光信号(光纤,电磁波), 用高频光表示 1 , 低频光表示 0

        // 组网: 组建一个网络 , (组件一些比较复杂的网络, 就需要涉及到一系列交换机路由器的知识操作...)

        // 广域网WAN
        //广域网，即 Wide Area Network，简称WAN。
        //通过路由器，将多个局域网连接起来，在物理上组成很大范围的网络，就形成了广域网。广域网内部的
        //局域网都属于其子网。

        //网络通信基础
        //网络互连的目的是进行网络通信，也即是网络数据传输，更具体一点，是网络主机中的不同进程间，基于网络传输数据。
        //那么，在组建的网络中，如何判断到底是从哪台主机，将数据传输到那台主机呢？这就需要使用IP地址来标识。

        // **** IP地址 ****
        //概念 :
        //IP地址主要用于标识网络主机、其他网络设备（如路由器）的网络地址。简单说，IP地址用于定位主机的网络地址。

        // 格式
        //IP地址是一个32位的二进制数，通常被分割为4个“8位二进制数”（也就是4个字节），如：
        //01100100.00000100.00000101.00000110。
        // 通常用“点分十进制”的方式来表示，即 a.b.c.d 的形式（a,b,c,d都是0~255之间的十进制整数）。如：
        //100.4.5.6。

        //特殊IP
        // 127.*的IP地址用于本机环回(loop back)测试，通常是127.0.0.1
        //本机环回主要用于本机到本机的网络通信（系统内部为了性能，不会走网络的方式传输），对于
        //开发网络通信的程序（即网络编程）而言，常见的开发方式都是本机到本机的网络通信。

        // **** 端口号 ****
        // 端口号 : 用于表示了一个具体的应用程序

        // **** 认识协议(重要) ****
        // 所谓协议就是一种约定, 商量好数据是啥样的格式来进行传输的, 有了这个约定 , 才能让双方相互理解对方的含义....
        // (发送方约好了我发的数据是啥样的, 接收方按照这个固定的格式来进行解析)
        // 一个协议可以简单也可以复杂
        // (如果这个协议太复杂的话,学习成本,使用,理解成本都会很高,因此采取的做法是将这大的复杂的协议拆分成几个相对简单的协议)
        // (随着拆分成几个小的协议, 就会发现有几个协议之间的作用是类似的, 就针对这些小的协议再进行"分类"(分层),)

        // 协议分层的好处~~
        // 1.降低了学习和维护的成本
        // 2.灵活的针对某一层的协议经行替换
        // 分层的作用
        //为什么需要网络协议的分层？
        //分层最大的好处，类似于面向接口编程：定义好两层间的接口规范，让双方遵循这个规范来对接。
        //在代码中，类似于定义好一个接口，一方为接口的实现类（提供方，提供服务），一方为接口的使用类
        //（使用方，使用服务）：
        //对于使用方来说，并不关心提供方是如何实现的，只需要使用接口即可
        //对于提供方来说，利用封装的特性，隐藏了实现的细节，只需要开放接口即可。


        //  当前互联网世界,协议分成两种
        // *** OSI七层模型 ***
        // OSI 七层模型既复杂又不实用：所以 OSI 七层模型没有落地、实现。
        //实际组建网络时，只是以 OSI 七层模型设计中的部分分层，也即是以下 TCP/IP 五层（或四层）模型来实现。
        // *** TCP/IP五层（或四层）模型 ***
        // TCP/IP是一组协议的代名词，它还包括许多协议，组成了TCP/IP协议簇。
        //TCP/IP通讯协议采用了5层的层级结构，每一层都呼叫它的下一层所提供的网络来完成自己的需求。

        //应用层：负责应用程序间沟通，如简单电子邮件传输（SMTP）、文件传输协议（FTP）、网络远
        //程访问协议（Telnet）等。我们的网络编程主要就是针对应用层。

        //传输层：负责两台主机之间的数据传输。如传输控制协议 (TCP)，能够确保数据可靠的从源主机发
        //送到目标主机。 (端到端之间的传输, 只在乎起点和终点)

        //网络层：负责地址管理和路由选择。例如在IP协议中，通过IP地址来标识一台主机，并通过路由表
        //的方式规划出两台主机之间的数据传输的线路（路由）。路由器（Router）工作在网路层。
        //数据链路层：负责设备之间的数据帧的传送和识别。例如网卡设备的驱动、帧同步(就是说从网线
        //上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。有以太网、令牌环网，
        // 无线LAN等标准。交换机（Switch）工作在数据链路层。 (主要负责路径的规划. 走哪条路比较划算)

       // (数据链路层 : 主要负责相邻接口之间的传输,具体怎么传输(用什么传输)) 当然这个层 TCP/IP协议上没有

        //物理层：负责光/电信号的传递方式。比如现在以太网通用的网线(双绞 线)、早期以太网采用的的
        //同轴电缆(现在主要用于有线电视)、光纤，现在的wifi无线网使用电磁波等都属于物理层的概念。
        //物理层的能力决定了最大传输速率、传输距离、抗干扰性等。集线器（Hub）工作在物理层。
        // 物理层我们考虑的比较少。因此很多时候也可以称为 TCP/IP四层模型。

        // 参考资料 : https://blog.csdn.net/superjunjin/article/details/7841099

        // TCP/IP 是 ISO的一种简化模型

        // 应用层

        // 传输层
        // 网络层        --> 这三层是密切配合的
        // 数据链路层

        // 物理层
        // 越往下越接近硬件设备 , 越往上, 就越接近用户
        // (我们通常会涉及到 实现一个 应用层协议)

        // 网络设备所在分层
        //对于一台主机，它的操作系统内核实现了从传输层到物理层的内容，也即是TCP/IP五层模型的下四层；
        //对于一台路由器，它实现了从网络层到物理层，也即是TCP/IP五层模型的下三层；
        //对于一台交换机，它实现了从数据链路层到物理层，也即是TCP/IP五层模型的下两层；
        //对于集线器，它只实现了物理层；
        //注意我们这里说的是传统意义上的交换机和路由器，也称为二层交换机（工作在TCP/IP五层模型的下两
        //层）、三层路由器（工作在TCP/IP五层模型的下三层）。
        // 随着现在网络设备技术的不断发展，也出现了很多3层或4层交换机，
        // 4层路由器。我们以下说的网络设备都是传统意义上的交换机和路由器。

        // 网络数据传输的基本流程(站在协议分层的背景下来理解的)
        // 以QQ为例 A 给 B 发送一个 hello 为例

        // 1. 应用层
        // 发送方 :  用户在输入框中 输入 hello 这个字符串, qq 这个应用程序, 就把这个字符串 给构造成一个应用层 数据报
        // 一个假设的应用层协议格式:
        // 发送方qq号; 发送时间; 接收方qq号; 消息内容
        // ______________________________________________________
        // | 123456 | 2023-11-29 21:47:00 | 2986119837 | hello |
        // ------------------------------------------------------

        // (应用层数据, 具体的数据格式 咱也是不清楚的)(所谓"应用层数据报"本质上就是一个遵守了约定格式的字符串)

        // 2. 传输层(进入到系统内核)
        // 在传输层中, 就要把上述应用层数据, 构造成 传输层的 数据报.
        // 传输层使用到的协议, 最知名的就是 UDP 和 TCP . 比如此处使用的是 UDP , 就需要构造出 UDP 的数据报 (在 应用层的数据上加上 UDP报头)
        // _____________________________________________________________
        //| UDP 报头| 123456 | 2023-11-29 21:47:00 | 2986119837 | hello |
        // -------------------------------------------------------------
        // 这是另外一个特定格式的字符串,此处就像字符串拼接一样
        // 所谓"报头" 就是一个"标签"
        // 通过标签表示出当前要把这个消息怎样进行传输
        // (传输层就把这个 UDP 数据报 交给 网络层)

        // 3. 网络层. 最知名的协议 IP 协议. IP 协议要基于上述数据,打包成一个 IP 数据报
        // ___________________________________________________________________
        //|IP报头| UDP 报头| 123456 | 2023-11-29 21:47:00 | 2986119837 | hello |
        // -------------------------------------------------------------------
        // 这里也相当于是一个字符串 (最核心的信息就是 源IP 和 目的 IP)
        // (传输过程中,需要知道, 源IP, 源端口, 目的IP,目的端口,协议类型)

        // 4. 数据链路层: 最知名的协议,叫做"以太网",基于上述数据,还要打包成一个"以太网数据帧"
        // _________________________________________________________________________________________
        //|以太网帧头|IP报头| UDP 报头| 123456 | 2023-11-29 21:47:00 | 2986119837 | hello | 以太网帧尾|
        // -----------------------------------------------------------------------------------------
        // (表示一个网络传输的数据单位: 包(packet) 报(datagram) 帧(frame) 段(segment))
        // 接下来这个数据继续往下传输 交给物理层

        // 交换机只是封装分用到数据链路层就可以完成后续的转发 (也叫做 二层转发)
        // ____________
        // | 数据链路层 |
        // ------------
        // |  物理层    |
        // -------------
        // 路由器封装分用到网络层就能完成后续转发.(也叫做 三层转发)
        // _____________
        // | 网络层     |
        // -------------
        // | 数据链路层 |
        // ------------
        // |  物理层    |
        // -------------

        // 5. 物理层
        // 把上述二进制数据(一串0101) 转换成 电信号 / 光信号
        // 此时就真的把数据转发出去了

        // 路由器是三层转发 --> 在网络层这里转发
        // 交换机是二层转发 --> 在数据链路层这里转发
        // (路由器是需要解析出IP协议 中的 源 IP 目的 IP来规划路径, 交换机:只需要关注下一步发到哪个相邻的设备上.不需要IP地址,在数据链路层有一个mac地址)

        // (上述过程, 从应用层,到物理层, 层层加码,这个过程叫做"封装"(不是面向对象的封装))


        // 接收方的工作
        // 只考虑 B 的接收 (不考虑中间过程)
        // 1.首先 网卡 接收到的信号是 光信号 和 电信号, 是在物理层 把这个光电信号转换回 二进制数据
        // 转换回这个数据,其实是一个以太网数据帧

        // 2.把这个数据交给数据链路层解析
        // 它就会把 以太网的帧头帧尾给去掉, 取出中间的载荷
        // (此时的载荷 就是 IP 数据报)
        // 然后再将其上交给网络层
        // (以太网数据帧帧头里也会记录 这个载荷是不是 IP 数据报)

        // 3.网络层,IP 协议针对这里进行解析,解析出IP 报头, 取出IP协议的载荷, 把这里得到的 传输层数据报,再交给上层的传输层
        // (IP 数据报里会记录是 UDP 还是 TCP)

        // 4.传输层 UDP再进行解析, 取出报头 , 取出载荷, 再把这个载荷交给对应的应用层程序
        // UDP 报头里有一个重要字段,"目的端口", 目的端口是一个具体的应用程序,关联在一起的.因此就可以根据这个端口 来把数据交给应用层程序

        // 5. 应用层. qq应用程序 qq就会针对应用层协议 也进行解析,显示到界面上

        // (上述 从下到上 层层解析 这个过程叫做"分用")
        // (震哥哥网络协议中,协议分成了很多层,上层协议要调用下层协议(上层协议把数据交给下层,继续封装),下层协议要给上层协议提供支持(下层协议解析好数据,交给上层))
        // 这里的几层协议之间是有明确的层级关系,只有相邻的两层之间才能进行交互(不能跨层交互)
        // 上述的这些约束,让整个同过程变得简单,清晰起来了

        // 网络分层对应
        //网络数据传输时，经过不同的网络节点（主机、路由器）时，网络分层需要对应。
        //以下为同一个网段内的两台主机进行文件传输：

        // 封装和分用
        //不同的协议层对数据包有不同的称谓，在传输层叫做段(segment)，在网络层叫做数据报
        //(datagram)，在链路层叫做帧(frame)。
        //应用层数据通过协议栈发到网络上时，每层协议都要加上一个数据首部(header)，称为封装
        //(Encapsulation)。
        //首部信息中包含了一些类似于首部有多长，载荷(payload)有多长，上层协议是什么等信息。
        //数据封装成帧后发到传输介质上，到达目的主机后每层协议再剥掉相应的首部，根据首部中
        //的 "上层协议字段" 将数据交给对应的上层协议处理。
    }
}